HAL DCMI initialization and configuration functions migration

The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2:

  • Open STM32CubeMX2 DCMI configuration panel.

  • Configure the SW layer HAL

  • Configure the main DCMI features.

  • Configure the additional feature configuration of the DCMI if needed.

  • Configure the GPIOs needed by the DCMI.

  • Configure the DCMI DMA(s) if the application requires to use the DCMI in DMA mode.

  • Configure the NVIC if the application requires the DCMI to be used in IT mode.

  • Generate the code.

HAL DCMI configuration panel

Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.

Project configuration panel

HAL DCMI main features configuration

Configure the DCMI main features.

DCMI main feature configuration

HAL DCMI additional features configuration

Configure the DCMI additional feature if needed.

I2C additional feature configuration

GPIO configuration

Configure gpio pins.

DCMI GPIO configuration

DMA configuration

Configure the DMA for data reception as needed.

DCMI DMA configuration

NVIC configuration

Configure the NVIC in case of an interrupt.

DCMI NVIC configuration

Generated DCMI initialization and de-initialization sequences

The DCMI initialization sequence is generated in the mx_dcmi_hal_init function in the mx_dcmi.c file under $YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.

Related concepts:

STM32CubeMX2 Generated : DCMI initialization and de-initialization sequences

Topic

HAL1 code snippet

HAL2 code snippet

Initialization and configuration sequence

static void MX_DCMI_Init(void)
{



  hdcmi.Instance = DCMI;






  hdcmi.Init.JPEGMode         = DCMI_JPEG_DISABLE;
  hdcmi.Init.PCKPolarity      = DCMI_PCKPOLARITY_FALLING;
  hdcmi.Init.HSPolarity       = DCMI_HSPOLARITY_LOW;
  hdcmi.Init.VSPolarity       = DCMI_VSPOLARITY_LOW;
  hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;






  hdcmi.Init.CaptureRate      = DCMI_CR_ALL_FRAME;






  hdcmi.Init.SynchroMode      = DCMI_SYNCHRO_EMBEDDED;
  hdcmi.Init.SyncroCode.FrameStartCode = 0;
  hdcmi.Init.SyncroCode.FrameEndCode   = 0;
  hdcmi.Init.SyncroCode.LineEndCode    = 0;
  hdcmi.Init.SyncroCode.LineStartCode  = 0;
  hdcmi.Init.ByteSelectMode   = DCMI_BSM_ALL;
  hdcmi.Init.ByteSelectStart  = DCMI_OEBS_ODD;
  hdcmi.Init.LineSelectMode   = DCMI_LSM_ALL;
  hdcmi.Init.LineSelectStart  = DCMI_OELS_ODD;
  if (HAL_DCMI_Init(&hdcmi) != HAL_OK) { Error_Handler(); }
}

void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hdcmi->Instance==DCMI)
  {
    /* Peripheral clock enable */
    __HAL_RCC_DCMI_PSSI_CLK_ENABLE();

    __HAL_RCC_GPIOI_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    /**DCMI GPIO Configuration
    PI6     ------> DCMI_D6
    PC11     ------> DCMI_D4
    PI5     ------> DCMI_VSYNC
    PB6     ------> DCMI_D5
    PH12     ------> DCMI_D3
    PI7     ------> DCMI_D7
    PH10     ------> DCMI_D1
    PE0     ------> DCMI_D2
    PH8     ------> DCMI_HSYNC
    PH9     ------> DCMI_D0
    PH5     ------> DCMI_PIXCLK
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
    HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);









    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);









    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);









    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_10|GPIO_PIN_8|GPIO_PIN_9
                          |GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);









    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_DCMI;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

    /* DCMI DMA Init */
    /* GPDMA1_REQUEST_DCMI Init */
    handle_GPDMA1_Channel12.Instance = GPDMA1_Channel12;
    handle_GPDMA1_Channel12.Init.Request = GPDMA1_REQUEST_DCMI;
    handle_GPDMA1_Channel12.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
    handle_GPDMA1_Channel12.Init.Direction = DMA_PERIPH_TO_MEMORY;
    handle_GPDMA1_Channel12.Init.SrcInc = DMA_SINC_FIXED;
    handle_GPDMA1_Channel12.Init.DestInc = DMA_DINC_FIXED;
    handle_GPDMA1_Channel12.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
    handle_GPDMA1_Channel12.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
    handle_GPDMA1_Channel12.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
    handle_GPDMA1_Channel12.Init.SrcBurstLength = 1;
    handle_GPDMA1_Channel12.Init.DestBurstLength = 1;
    handle_GPDMA1_Channel12.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
    handle_GPDMA1_Channel12.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
    handle_GPDMA1_Channel12.Init.Mode = DMA_NORMAL;
    if (HAL_DMA_Init(&handle_GPDMA1_Channel12) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(hdcmi, DMA_Handle, handle_GPDMA1_Channel12);

    if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel12, DMA_CHANNEL_NPRIV) != HAL_OK)
    {
      Error_Handler();
    }







    /* DCMI interrupt Init */
    HAL_NVIC_SetPriority(DCMI_PSSI_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DCMI_PSSI_IRQn);
  }

}
hal_dcmi_handle_t *mx_dcmi_hal_init(void)
{
  hal_dcmi_parallel_config_t          p_parallel_config;
  hal_dcmi_pipe_config_t              p_pipe_config;

  if (HAL_DCMI_Init(&hDCMI, HAL_DCMI) != HAL_OK)
  {
    return NULL;
  }

  HAL_RCC_DCMI_PSSI_EnableClock();

  p_parallel_config.format         = HAL_DCMI_FORMAT_UNCOMPRESSED;
  p_parallel_config.pixel_polarity = HAL_DCMI_PIXEL_CLOCK_FALLING;
  p_parallel_config.hsync_polarity = HAL_DCMI_HSYNC_LOW;
  p_parallel_config.vsync_polarity = HAL_DCMI_VSYNC_LOW;
  p_parallel_config.data_width     = HAL_DCMI_EXTENDED_DATA_8_BITS;

  if (HAL_DCMI_PARALLEL_SetConfig(&hDCMI, &p_parallel_config) != HAL_OK)
  {
    return NULL;
  }

  p_pipe_config.frame_rate = HAL_DCMI_FRAME_CAPTURE_ALL;

  if (HAL_DCMI_SetConfigPipe(&hDCMI, HAL_DCMI_PIPE_0, &p_pipe_config) != HAL_OK)
  {
    return NULL;
  }

  /* The configuration of the synchronization mode, synchronization code, byte select mode,
  byte select start, line select mode and line select start are set to their default values
  thus in HAL2 we do not need for additional function calls to configure these settings */










  /* DCMI GPIO Configuration **************************************************/
  HAL_RCC_GPIOA_EnableClock();
  HAL_RCC_GPIOC_EnableClock();
  HAL_RCC_GPIOE_EnableClock();
  HAL_RCC_GPIOB_EnableClock();

  hal_gpio_config_t  gpio_config;

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PA6     ------>   DCMI_PIXCLK
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_4;
  HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_6, &gpio_config);

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PA9     ------>   DCMI_D0
      PA10    ------>   DCMI_D1
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_5;
  HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_9 | HAL_GPIO_PIN_10, &gpio_config);

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PC11    ------>   DCMI_D2
      PC9     ------>   DCMI_D3
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_4;
  HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_11 | HAL_GPIO_PIN_9, &gpio_config);

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PE4     ------>   DCMI_D4
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_10;
  HAL_GPIO_Init(HAL_GPIOE, HAL_GPIO_PIN_4, &gpio_config);

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PB6     ------>   DCMI_D5
      PB8     ------>   DCMI_D6
      PB9     ------>   DCMI_D7
      PB7     ------>   DCMI_VSYNC
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_10;
  HAL_GPIO_Init(HAL_GPIOB,
  HAL_GPIO_PIN_6 | HAL_GPIO_PIN_8 | HAL_GPIO_PIN_9 | HAL_GPIO_PIN_7, &gpio_config);

  /**
    DCMI GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

      PA4     ------>   DCMI_HSYNC
    **/
  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_UP;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_VERY_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_10;
  HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_4, &gpio_config);

  /* DMA Configuration ********************************************************/

  HAL_RCC_GPDMA1_EnableClock();

  if (HAL_DMA_Init(&hGPDMA1_CH0, HAL_GPDMA1_CH0) != HAL_OK)
  {
    return NULL;
  }

  hal_dma_direct_xfer_config_t xfer_cfg_dcmi_dma_pssi_dma;
  xfer_cfg_dcmi_dma_pssi_dma.request         = HAL_GPDMA1_REQUEST_DCMI_PSSI;
  xfer_cfg_dcmi_dma_pssi_dma.direction       = HAL_DMA_DIRECTION_PERIPH_TO_MEMORY;
  xfer_cfg_dcmi_dma_pssi_dma.src_inc         = HAL_DMA_SRC_ADDR_FIXED;
  xfer_cfg_dcmi_dma_pssi_dma.dest_inc        = HAL_DMA_DEST_ADDR_INCREMENTED;
  xfer_cfg_dcmi_dma_pssi_dma.src_data_width  = HAL_DMA_SRC_DATA_WIDTH_WORD;
  xfer_cfg_dcmi_dma_pssi_dma.dest_data_width = HAL_DMA_DEST_DATA_WIDTH_WORD;
  xfer_cfg_dcmi_dma_pssi_dma.priority        = HAL_DMA_PRIORITY_LOW_WEIGHT_LOW;

  if (HAL_DMA_SetConfigPeriphDirectXfer(&hGPDMA1_CH0, &xfer_cfg_dcmi_dma_pssi_dma) != HAL_OK)
  {
    return NULL;
  }

  /* Enable the interruption for GPDMA1_CH0 */
  HAL_CORTEX_NVIC_SetPriority(GPDMA1_CH0_IRQn,
                              HAL_CORTEX_NVIC_PREEMP_PRIORITY_0,
                              HAL_CORTEX_NVIC_SUB_PRIORITY_0);
  HAL_CORTEX_NVIC_EnableIRQ(GPDMA1_CH0_IRQn);

  /* Link the DMA handle to the DCMI handle */
  if (HAL_DCMI_SetDMA(&hDCMI, &hGPDMA1_CH0) != HAL_OK)
  {
    return NULL;
  }

  /* DCMI NVIC Configuration **************************************************/
  HAL_CORTEX_NVIC_SetPriority(DCMI_PSSI_IRQn,
                              HAL_CORTEX_NVIC_PREEMP_PRIORITY_0,
                              HAL_CORTEX_NVIC_SUB_PRIORITY_0);
  HAL_CORTEX_NVIC_EnableIRQ(DCMI_PSSI_IRQn);

  return &hDCMI;
}

Deinitialization sequence

void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
{
  if(hdcmi->Instance==DCMI)
  {
    /* Peripheral clock disable */
    __HAL_RCC_DCMI_PSSI_CLK_DISABLE();

    /**DCMI GPIO Configuration
    PI6     ------> DCMI_D6
    PC11     ------> DCMI_D4
    PI5     ------> DCMI_VSYNC
    PB6     ------> DCMI_D5
    PH12     ------> DCMI_D3
    PI7     ------> DCMI_D7
    PH10     ------> DCMI_D1
    PE0     ------> DCMI_D2
    PH8     ------> DCMI_HSYNC
    PH9     ------> DCMI_D0
    PH5     ------> DCMI_PIXCLK
    */
    HAL_GPIO_DeInit(GPIOI,
    GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_7);

    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11);

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);

    HAL_GPIO_DeInit(GPIOH,
    GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_5);

    HAL_GPIO_DeInit(GPIOE, GPIO_PIN_0);

    /* DCMI DMA DeInit */
    HAL_DMA_DeInit(hdcmi->DMA_Handle);

    /* DCMI interrupt DeInit */
    HAL_NVIC_DisableIRQ(DCMI_PSSI_IRQn);
  }

}
void mx_dcmi_deinit(void)
{
  /* De-initialize the DCMI */
  HAL_DCMI_DeInit(&hDCMI);

  /* De-initialize the DMA channel */
  HAL_DMA_DeInit(&hGPDMA1_CH0);

  /* Disable the interruption for DMA */
  HAL_CORTEX_NVIC_DisableIRQ(GPDMA1_CH0_IRQn);

  /* Disable the interruption for DCMI */
  HAL_CORTEX_NVIC_DisableIRQ(DCMI_PSSI_IRQn);









  /* De-initialize all GPIO pins associated with DCMI */
  HAL_GPIO_DeInit(HAL_GPIOA,
  HAL_GPIO_PIN_4| HAL_GPIO_PIN_6 | HAL_GPIO_PIN_9 | HAL_GPIO_PIN_10);

  HAL_GPIO_DeInit(HAL_GPIOC, HAL_GPIO_PIN_9 | HAL_GPIO_PIN_11);

  HAL_GPIO_DeInit(HAL_GPIOE, HAL_GPIO_PIN_4);

  HAL_GPIO_DeInit(HAL_GPIOB,
  HAL_GPIO_PIN_6 | HAL_GPIO_PIN_7 | HAL_GPIO_PIN_8 | HAL_GPIO_PIN_9);


  HAL_RCC_DCMI_PSSI_DisableClock();
}